﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using Entity;

namespace Data
{
    public class UtilisateurData
    {

        /// <summary>
        /// Ajoute un utilisateur.
        /// </summary>
        /// <param name="prenom">Prénom de l'utilisateur</param>
        /// <param name="nom">Nom de l'utilisateur</param>
        /// <param name="email">E-mail de l'utilisateur</param>
        /// <param name="password">Mot de passe de l'utilisateur</param>
        /// <param name="sexe">Sexe de l'utilisateur</param>
        /// <param name="filiere">Fillière de l'utilisateur</param>
        /// <param name="promotion">Promotion de l'utilisateur</param>
        /// <param name="datenaissance">Date de naissance de l'utilisateur</param>
        /// <returns>L'utilisateur créé</returns>
        public static Utilisateur ajouterUtilisateur(String prenom,
            String nom,
            String email,
            String password,
            char sexe,
            String filliere,
            int promotion,
            DateTime datenaissance)
        {
            ModeleDataContext mdl = DataContext.Context;

            Utilisateur utilisateur = new Utilisateur();
            utilisateur.prenom = prenom;
            utilisateur.nom = nom;
            utilisateur.email = email;
            utilisateur.password = password;
            utilisateur.sexe = (Sexe.getSexes().Contains(sexe)) ? sexe : Sexe.MASCULIN;
            utilisateur.filliere = (Filliere.getFillieres().Contains(filliere)) ? filliere : Filliere.IRC;
            utilisateur.promotion = promotion;
            utilisateur.datenaissance = datenaissance;

            mdl.Utilisateur.InsertOnSubmit(utilisateur);
            mdl.SubmitChanges();
			
			// On retourne l'utilsateur enrichi de son identifiant
			return utilisateur;
        }

        /// <summary>
        /// Met à jour un utilisateur.
        /// </summary>
        /// <param name="idutilisateur">L'identifiant de l'utilisateur à modifier</param>
        /// <param name="prenom">Prénom de l'utilisateur</param>
        /// <param name="nom">Nom de l'utilisateur</param>
        /// <param name="email">E-mail de l'utilisateur</param>
        /// <param name="password">Mot de passe de l'utilisateur</param>
        /// <param name="sexe">Sexe de l'utilisateur</param>
        /// <param name="filiere">Fillière de l'utilisateur</param>
        /// <param name="promotion">Promotion de l'utilisateur</param>
        /// <param name="datenaissance">Date de naissance de l'utilisateur</param>
        public static void majUtilisateur(int idutilisateur,
            String prenom,
            String nom,
            String email,
            String password,
            char sexe,
            String filliere,
            int promotion,
            DateTime datenaissance)
        {
            ModeleDataContext mdl = DataContext.Context;

            Utilisateur utilisateur = getUtilisateur(idutilisateur);
            utilisateur.prenom = prenom;
            utilisateur.nom = nom;
            utilisateur.email = email;
            if (password != "")
                utilisateur.password = password;
            utilisateur.sexe = (Sexe.getSexes().Contains(sexe)) ? sexe : Sexe.MASCULIN;
            utilisateur.filliere = (Filliere.getFillieres().Contains(filliere)) ? filliere : Filliere.IRC;
            utilisateur.promotion = promotion;
            utilisateur.datenaissance = datenaissance;

            mdl.SubmitChanges();
        }

        /* Non utilisé.
         * Laissé ici au cas où.
        /// <summary>
        /// Supprime un utilisateur.
        /// </summary>
        /// <param name="idutilisateur">L'identifiant de l'utilisateur à supprimer</param>
        public static void supprimerUtilisateur(int idutilisateur)
        {
            ModeleDataContext mdl = DataContext.Context;

            Utilisateur utilisateur = new Utilisateur();
            utilisateur.idutilisateur = idutilisateur;

            mdl.Utilisateur.Attach(utilisateur);
            mdl.Utilisateur.DeleteOnSubmit(utilisateur);
        }*/

        /// <summary>
        /// Retourne les informations d'un utilisateur par son identifiant.
        /// </summary>
        /// <param name="idutilisateur">L'identifiant de l'utilisateur.</param>
        /// <returns>L'utilisateur recherché, ou null s'il n'existe pas</returns>
        public static Utilisateur getUtilisateur(int idutilisateur)
        {
            ModeleDataContext mdl = DataContext.Context;

            var sql = from u in mdl.Utilisateur
                      where u.idutilisateur == idutilisateur
                      select u;

            List<Utilisateur> utilisateurs = sql.ToList();
            if (utilisateurs.Count > 0)
                return utilisateurs[0];
            else
                return null;
        }

        /// <summary>
        /// Retourne les informations d'un utilisateur par son email.
        /// </summary>
        /// <param name="email">L'email de l'utilisateur</param>
        /// <returns>L'utilisateur ou alors null s'il n'existe pas</returns>
        public static Utilisateur getUtilisateur(string email)
        {
            ModeleDataContext mdl = DataContext.Context;

            var sql = from u in mdl.Utilisateur
                      where u.email == email
                      select u;

            List<Utilisateur> utilisateurs = sql.ToList();
            if (utilisateurs.Count > 0)
                return utilisateurs[0];
            else
                return null;
        }

        /// <summary>
        /// Retourne les informations d'un utilisateur par son email et mot de passe.
        /// </summary>
        /// <param name="email">L'email de l'utilisateur</param>
        /// <param name="password">Le mot de passe de l'utilisateur</param>
        /// <returns>L'utilisateur ou alors null s'il n'existe pas</returns>
        public static Utilisateur getUtilisateur(String email, String password)
        {
            ModeleDataContext mdl = DataContext.Context;

            var sql = from u in mdl.Utilisateur
                      where
                            u.email == email
                            && u.password == password
                      select u;

            List<Utilisateur> utilisateurs = sql.ToList();
            if (utilisateurs.Count > 0)
                return utilisateurs[0];
            else
                return null;
        }

        /// <summary>
        /// Retourne les utilisateurs ayant un mot dans leur prenom ou leurs noms.
        /// </summary>
        /// <param name="email">L'email de l'utilisateur</param>
        /// <returns>L'utilisateur ou alors null s'il n'existe pas</returns>
        public static List<Utilisateur> rechercherUtilisateur(string motcle)
        {
            ModeleDataContext mdl = DataContext.Context;

            var sql = from u in mdl.Utilisateur
                      where
                            u.prenom.Contains(motcle)
                            || u.nom.Contains(motcle)
                      select u;

            List<Utilisateur> utilisateurs = sql.ToList();
            if (utilisateurs.Count > 0)
                return utilisateurs;
            else
                return null;
        }


        /// <summary>
        /// Retourne les utilisateurs ayant la fillière donnée.
        /// </summary>
        /// <param name="email">La fillière de l'utilisateur</param>
        /// <returns>L'utilisateur ou alors null s'il n'existe pas</returns>
        public static List<Utilisateur> rechercherUtilisateurParFilliere(string filliere)
        {
            ModeleDataContext mdl = DataContext.Context;

            var sql = from u in mdl.Utilisateur
                      where
                            u.filliere == filliere
                      select u;

            List<Utilisateur> utilisateurs = sql.ToList();
            if (utilisateurs.Count > 0)
                return utilisateurs;
            else
                return null;
        }


        /// <summary>
        /// Retourne les utilisateurs ayant la promotion donnée.
        /// </summary>
        /// <param name="email">La promotion de l'utilisateur</param>
        /// <returns>L'utilisateur ou alors null s'il n'existe pas</returns>
        public static List<Utilisateur> rechercherUtilisateurParPromotion(int promotion)
        {
            ModeleDataContext mdl = DataContext.Context;

            var sql = from u in mdl.Utilisateur
                      where
                            u.promotion == promotion
                      select u;

            List<Utilisateur> utilisateurs = sql.ToList();
            if (utilisateurs.Count > 0)
                return utilisateurs;
            else
                return null;
        }


        /// <summary>
        /// Retourne les utilisateurs ayant la promotion donnée.
        /// </summary>
        /// <param name="email">La promotion de l'utilisateur</param>
        /// <returns>L'utilisateur ou alors null s'il n'existe pas</returns>
        public static List<Utilisateur> rechercherUtilisateursParFilliereEtPromotion(String filliere, int promotion)
        {
            ModeleDataContext mdl = DataContext.Context;

            var sql = from u in mdl.Utilisateur
                      where
                            u.filliere == filliere
                            && u.promotion == promotion
                      select u;

            List<Utilisateur> utilisateurs = sql.ToList();
            if (utilisateurs.Count > 0)
                return utilisateurs;
            else
                return null;
        }
    }
}
